+Mon May 15 15:12:05 2006 Søren Sandmann <sandmann@redhat.com>
+
+ * gtk/gtklayout.c (gtk_layout_realize),
+ * gtk/gtkiconview.c (gtk_icon_view_realize),
+ * gtk/gtktreeview.c (gtk_tree_view_realize): Set the background of
+ the clip windows to NULL, since they are generally invisible and
+ don't have EXPOSURE set, which means they temp-unvlicker code
+ doesn't apply to them.
+
+ * gdk/x11/gdkgeometry-x11.c (_gdk_window_move_resize_child): Unset
+ the background of the parent window during resizing. Invalidate
+ the uncoered area of the parent window. Bug 341332.
+
2006-05-15 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkevents-quartz.c (_gdk_events_init): Remove obsolete
+Mon May 15 15:12:05 2006 Søren Sandmann <sandmann@redhat.com>
+
+ * gtk/gtklayout.c (gtk_layout_realize),
+ * gtk/gtkiconview.c (gtk_icon_view_realize),
+ * gtk/gtktreeview.c (gtk_tree_view_realize): Set the background of
+ the clip windows to NULL, since they are generally invisible and
+ don't have EXPOSURE set, which means they temp-unvlicker code
+ doesn't apply to them.
+
+ * gdk/x11/gdkgeometry-x11.c (_gdk_window_move_resize_child): Unset
+ the background of the parent window during resizing. Invalidate
+ the uncoered area of the parent window. Bug 341332.
+
2006-05-15 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkevents-quartz.c (_gdk_events_init): Remove obsolete
gdk_region_destroy (dest_region);
}
+static void
+reset_backgrounds (GdkWindow *window)
+{
+ GdkWindowObject *obj = (GdkWindowObject *)window;
+
+ _gdk_x11_window_tmp_reset_bg (window, FALSE);
+
+ if (obj->parent)
+ _gdk_x11_window_tmp_reset_bg ((GdkWindow *)obj->parent, FALSE);
+}
+
void
_gdk_window_move_resize_child (GdkWindow *window,
gint x,
gint dx, dy;
gboolean is_move;
gboolean is_resize;
+
+ GdkRectangle old_pos;
g_return_if_fail (window != NULL);
- g_return_if_fail (GDK_IS_WINDOW (window));
+ g_return_if_fail (GDK_IS_WINDOW (window));
impl = GDK_WINDOW_IMPL_X11 (GDK_WINDOW_OBJECT (window)->impl);
obj = GDK_WINDOW_OBJECT (window);
-
+
dx = x - obj->x;
dy = y - obj->y;
if (!is_move && !is_resize)
return;
+ old_pos.x = obj->x;
+ old_pos.y = obj->y;
+ old_pos.width = impl->width;
+ old_pos.height = impl->height;
+
obj->x = x;
obj->y = y;
impl->width = width;
XMoveResizeWindow (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XID (window),
new_info.x, new_info.y, new_info.width, new_info.height);
-
- if (impl->position_info.no_bg)
- _gdk_x11_window_tmp_reset_bg (window, FALSE);
+
+ reset_backgrounds (window);
if (!impl->position_info.mapped && new_info.mapped && GDK_WINDOW_IS_MAPPED (obj))
XMapWindow (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XID (window));
tmp_list = tmp_list->next;
}
- if (impl->position_info.no_bg)
- _gdk_x11_window_tmp_reset_bg (window, FALSE);
-
+ reset_backgrounds (window);
+
if (!impl->position_info.mapped && new_info.mapped && GDK_WINDOW_IS_MAPPED (obj))
XMapWindow (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XID (window));
impl->position_info = new_info;
}
+
+ if (GDK_WINDOW_IS_MAPPED (obj) && obj->parent)
+ gdk_window_invalidate_rect ((GdkWindow *)obj->parent, &old_pos, FALSE);
}
static void
if (!impl->position_info.mapped && new_info.mapped && GDK_WINDOW_IS_MAPPED (obj))
XMapWindow (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window));
- if (impl->position_info.no_bg)
- _gdk_x11_window_tmp_reset_bg (window, FALSE);
+ reset_backgrounds (window);
impl->position_info = new_info;
gdk_window_invalidate_region (window, new_clip_region, FALSE);
}
+ if (obj->parent)
+ _gdk_x11_window_tmp_unset_bg ((GdkWindow *)obj->parent, FALSE);
+
gdk_region_destroy (new_clip_region);
gdk_region_destroy (old_clip_region);
}
}
}
+/* Unsetting and resetting window backgrounds.
+ *
+ * In many cases it is possible to avoid flicker by unsetting the
+ * background of windows. For example if the background of the
+ * parent window is unset when a window is unmapped, a brief flicker
+ * of background painting is avoided.
+ */
void
_gdk_x11_window_tmp_unset_bg (GdkWindow *window,
gboolean recurse)
widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),
&attributes, attributes_mask);
+ gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
gdk_window_set_user_data (widget->window, widget);
/* Make the window for the icon view */
widget->style = gtk_style_attach (widget->style, widget->window);
gdk_window_set_background (icon_view->priv->bin_window, &widget->style->base[widget->state]);
- gdk_window_set_background (widget->window, &widget->style->base[widget->state]);
gdk_window_show (icon_view->priv->bin_window);
}
widget->window = gdk_window_new (gtk_widget_get_parent_window (widget),
&attributes, attributes_mask);
+ gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
gdk_window_set_user_data (widget->window, widget);
attributes.x = - layout->hadjustment->value,
gdk_window_set_user_data (layout->bin_window, widget);
widget->style = gtk_style_attach (widget->style, widget->window);
- gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL);
gtk_style_set_background (widget->style, layout->bin_window, GTK_STATE_NORMAL);
tmp_list = layout->children;
/* Add them all up. */
widget->style = gtk_style_attach (widget->style, widget->window);
- gdk_window_set_background (widget->window, &widget->style->base[widget->state]);
+ gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
gdk_window_set_background (tree_view->priv->bin_window, &widget->style->base[widget->state]);
gtk_style_set_background (widget->style, tree_view->priv->header_window, GTK_STATE_NORMAL);
if (GTK_WIDGET_REALIZED (widget))
{
- gdk_window_set_background (widget->window, &widget->style->base[widget->state]);
+ gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
gdk_window_set_background (tree_view->priv->bin_window, &widget->style->base[widget->state]);
}
if (GTK_WIDGET_REALIZED (widget))
{
- gdk_window_set_background (widget->window, &widget->style->base[widget->state]);
+ gdk_window_set_back_pixmap (widget->window, NULL, FALSE);
gdk_window_set_background (tree_view->priv->bin_window, &widget->style->base[widget->state]);
}